package com.example.day04;

import com.example.day03.ConstantEnumIFace;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;

import java.io.IOException;

/**
 * @author jeff
 * @time 2023/5/1 22:19
 * 第一个T，表示这个Deserializer只为实现ConstantEnumIFace的类做反序列化
 * 第二个T，表示ConstantEnumIFace接口中的方法，返回的类型为T
 * 第三个T，表示这个Deserializer只为T类型数据做反序列化
 */
public class ConstantEnumJsonDeserializer<T extends ConstantEnumIFace<T>> extends JsonDeserializer<T > implements ContextualDeserializer {

    private T firstEnum;

    @Override
    public T deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException {
        final String source = jsonParser.getText();
        System.out.println("正在执行deserialize方法:"+source);
        int i = Integer.parseInt(source);
        return firstEnum.theEnum(i);
    }
    private void setFirstEnum(T firstEnum){
        this.firstEnum=firstEnum;
    }

    @Override
    public JsonDeserializer<T> createContextual(DeserializationContext deserializationContext, BeanProperty beanProperty) {
//        重新创建Deserializer
        ConstantEnumJsonDeserializer<T> tUserStatusEnumDeserializer = new ConstantEnumJsonDeserializer<>();
//        设置枚举类型数据
        JavaType type = beanProperty.getType();
        Class<T> rawClass = (Class<T>)type.getRawClass();
        System.out.println("正在创建JsonDeserializer，类型："+rawClass.getName());
        firstEnum = rawClass.getEnumConstants()[0];
        tUserStatusEnumDeserializer.setFirstEnum(firstEnum);
        return tUserStatusEnumDeserializer;
    }
}
